이 강좌에서 다룬 PreToolUse와 PostToolUse 훅 외에도 더 많은 훅이 있습니다. 다음과 같은 훅들도 있습니다:
-
Notification- Claude Code가 알림을 보낼 때 실행됩니다. Claude가 도구 사용 권한이 필요하거나, Claude Code가 60초 동안 유휴 상태일 때 발생합니다 -
Stop- Claude Code가 응답을 완료했을 때 실행됩니다 -
SubagentStop- 서브에이전트(UI에서 "Task"로 표시됨)가 완료되었을 때 실행됩니다 -
PreCompact- 수동 또는 자동으로 컴팩트 작업이 수행되기 전에 실행됩니다 -
UserPromptSubmit- 사용자가 프롬프트를 제출할 때, Claude가 처리하기 전에 실행됩니다 -
SessionStart- 세션을 시작하거나 재개할 때 실행됩니다 -
SessionEnd- 세션이 종료될 때 실행됩니다
여기서 헷갈리는 부분이 있습니다:
-
명령어의 stdin 입력은 실행되는 훅 유형(
PreToolUse,PostToolUse,Notification등)에 따라 달라집니다 -
그 안에 포함된
tool_input은 호출된 도구에 따라 다릅니다(PreToolUse및PostToolUse훅의 경우)
예를 들어, 다음은 훅에 대한 stdin 입력 샘플입니다. 이 훅은 TodoWrite 도구 사용을 감시하는 PostToolUse 훅입니다. 참고로, TodoWrite는 Claude가 할 일 항목을 추적하는 데 사용하는 도구입니다.
{
"session_id": "9ecf22fa-edf8-4332-ae85-b6d5456eda64",
"transcript_path": "<path_to_transcript>",
"hook_event_name": "PostToolUse",
"tool_name": "TodoWrite",
"tool_input": {
"todos": [{ "content": "write a readme", "status": "pending", "priority": "medium", "id": "1" }]
},
"tool_response": {
"oldTodos": [],
"newTodos": [{ "content": "write a readme", "status": "pending", "priority": "medium", "id": "1" }]
}
}
비교를 위해, 다음은 Stop 훅에 대한 입력 예시입니다:
{
"session_id": "af9f50b6-f042-4773-b3e2-c3a4814765ce",
"transcript_path": "<path_to_transcript>",
"hook_event_name": "Stop",
"stop_hook_active": false
}
보시다시피, 명령어의 stdin 입력은 훅 유형( PreToolUse , PostToolUse , Stop 등) 및 사용된 매처( PreToolUse 와 PostToolUse 의 경우)에 따라 크게 달라집니다. 이로 인해 훅 작성이 어려울 수 있습니다 - 명령어에 입력될 데이터의 정확한 구조를 알지 못할 수도 있습니다!
이 문제를 해결하려면 다음과 같은 헬퍼 훅을 만들어 보세요:
"PostToolUse": [ // Or "PreToolUse" or "Stop", etc
{
"matcher": "*",
"hooks": [
{
"type": "command",
"command": "jq . > post-log.json"
}
]
},
]
제공된 명령어를 주목하세요. 이 훅에 대한 입력을 post-log.json 파일에 기록하여, 명령어에 실제로 무엇이 전달되는지 정확히 확인할 수 있습니다! 이를 통해 명령어가 어떤 데이터를 처리해야 하는지 훨씬 쉽게 이해할 수 있습니다.
